﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

using DAL.Entity;

namespace DAL.Persistencia
{
    public class MealDAL
    {
        NewTierraEntities Con = new NewTierraEntities();

        //Método para gravar um registro na tabela Periodo
        public void Salvar(S_Mercado_Meal c)
        {
            try
            {

                //Rotinas prontas para o banco de dados
                Con.AddToS_Mercado_Meal(c); //insert into S_Mercado_Meal values...
                Con.SaveChanges(); //Executar a operação

            }
            catch
            {
                throw;
            }
        }

        //Método para Excluir o S_Mercado_Meal na base
        public void Excluir(S_Mercado_Meal c)
        {
            try
            {
                Con.DeleteObject(c); //Prepara a deleção
                Con.SaveChanges(); //Executa a transação (commit)
            }
            catch
            {
                throw;
            }
        }

        //Metodo para listar todos os S_Mercado_Meal cadastrados
        public List<S_Mercado_Meal> ListarTodos()
        {
            try
            {
                //SQL -> select * from S_Mercado_Meal
                return Con.S_Mercado_Meal.ToList();
            }
            catch
            {
                throw;
            }
        }

        public List<S_Mercado_Meal> ListarTodosLista(int IdPeriodo)
        {
            try
            {
                using (NewTierraEntities Con = new NewTierraEntities())
                {
                    return Con.S_Mercado_Meal.Where(m => m.S_merc_periodo_id == IdPeriodo).ToList();
                }
            }
            catch 
            {    
                throw;
            }
        }

         //Metodo para listar todos os S_Mercado_Meal cadastrados por periodo ID e left join
        public object ListarTodos(Int32 PeriodoID)
        {
            try
            { 
            var query = from m in Con.S_Meal 
                        join mm in Con.S_Mercado_Meal on m.S_meal_id equals mm.S_meal_id 
                        join mts in Con.S_Mercado_Tarifa_Status on mm.S_merc_tarif_status_id equals mts.S_mercado_tarifa_status_id into leftjoin
                        from lf in leftjoin.DefaultIfEmpty()
                        where mm.S_merc_periodo_id == PeriodoID
                        orderby m.S_meal_nome ascending
                        select new
                        {
                            mm.S_merc_meal_tarifa_total,
                            mm.S_merc_meal_id,
                            m.S_meal_nome,
                            mm.S_merc_meal_tarifa,
                            lf.S_mercado_tarifa_status_nome
                        };
                return query.ToList();
            }
            catch
            {
                throw;
            }
        }

        //Método para obter 1 S_Mercado_Meal pelo Id
        public S_Mercado_Meal ObterPorId(int IdMercadoMeal)
        {
            try
            {
                //select * from TbCliente where IdCliente = ?
                return Con.S_Mercado_Meal.Where(c => c.S_merc_meal_id == IdMercadoMeal).Single();

                //Single -> Retorna apenas 1 Registro e dá erro para qualquer
                //          resultado diferente de 1 Registro.
            }
            catch
            {
                throw;
            }
        }

        public bool VerificaMealCadastrado(S_Mercado_Meal c)
        {
            try
            {
                using (NewTierraEntities Con = new NewTierraEntities())
                {
                    return Con.S_Mercado_Meal.Where(m => m.S_meal_id == c.S_meal_id &&
                                                    m.S_merc_tarif_status_id == c.S_merc_tarif_status_id &&
                                                    m.S_merc_periodo_id == c.S_merc_periodo_id)
                                                    .Count() != 0;
                }
            }
            catch
            {
                throw;
            }
        }

        //Método para atualizar os dados do S_Mercado_Meal
        public void Atualizar(S_Mercado_Meal registroNovo)
        {
            try
            {
                //Buscar na base de dados o Registro antigo
                S_Mercado_Meal registroAntigo = ObterPorId(registroNovo.S_merc_meal_id);

                //Atualizando os dados
                registroAntigo.S_meal_id = registroNovo.S_meal_id;
                registroAntigo.S_merc_meal_tarifa = registroNovo.S_merc_meal_tarifa;
                registroAntigo.S_merc_meal_tarifa_total = registroNovo.S_merc_meal_tarifa_total;
                registroAntigo.S_merc_tarif_status_id = registroNovo.S_merc_tarif_status_id;
                registroAntigo.S_merc_periodo_id = registroNovo.S_merc_periodo_id;


                //Executo a transação
                Con.SaveChanges();
            }
            catch
            {
                throw;
            }
        }
    }
}
